#include "gestionFichier.h"

void InitialiseGFichier(gFichier * gFichier)
{
  pthread_mutex_init(&(gFichier->mut), NULL);
  initializes_List(&(gFichier->liste), initialisationCopEltFich, testamentEltFich, afficherEltFich, comparaisonEltFich);
}

void TestamentGFichier(gFichier * gFichier)
{
  testament_List(&(gFichier->liste));
  pthread_mutex_destroy(&(gFichier->mut));
}

int InsererFichier(gFichier * gFichier, Element e)
{
  pthread_mutex_lock(&(gFichier->mut));
  if(insertLast_List(e, &gFichier->liste) == LIST_ERR)
    {
      pthread_mutex_unlock(&(gFichier->mut));
      return 1;
    }
  pthread_mutex_unlock(&(gFichier->mut));
  return 0;
}

int SupprimerFichier(gFichier * gFichier, Element e)
{
  int ret = 0;
  ret = ChercherFichier(gFichier, e);
  if(ret == 1 || ret == 3)
    {
      pthread_mutex_lock(&(gFichier->mut));  
      if(deleteCurrent_List(&(gFichier->liste)) == LIST_SUCCESS)
	{
	  pthread_mutex_unlock(&(gFichier->mut));
	  return 1;
	}else
	{
	  pthread_mutex_unlock(&(gFichier->mut));
	  return 2;
	}
    }
  else if(ret == 2)
    {
      return 3;
    }
  return 0;
}

int ChercherFichier(gFichier * gFichier, Element e)
{
  pthread_mutex_lock(&(gFichier->mut));
  if(gFichier != NULL)
    {
      if(isEmpty_List(&(gFichier->liste)) == LIST_NOT_EMPTY)
	{
	  first_List(&gFichier->liste);
	  do{
	    Element ret = getDataCurrent_List(&(gFichier->liste));
	    if(ret != NULL)
	      {
		Fichier *t = (Fichier *) e;
		Fichier *d = (Fichier *) ret;
		if(strcmp(t->nomFichier, d->nomFichier) == 0 && t->socket == d->socket)
		  {
		    pthread_mutex_unlock(&(gFichier->mut));
		    return 1;
		  }
		if(strcmp(t->nomFichier, d->nomFichier) == 0)
		  {
		    pthread_mutex_unlock(&(gFichier->mut));
		    return 2;
		  }
		if(t->socket == d->socket)
		  {
		    pthread_mutex_unlock(&(gFichier->mut));
		    return 3;
		  }
	      }
	  }while(next_List(&gFichier->liste) == LIST_SUCCESS);
	}
    }
  pthread_mutex_unlock(&(gFichier->mut));
  return 0;
}

int SendListeFichier(char * pathDir, int socket)
{
  int ret = 0;
  GDir* monDossier=g_dir_open(pathDir, 0, NULL);
  G_CONST_RETURN gchar* file = g_dir_read_name(monDossier);
  while(file != NULL)
    {
      char * tmp =(char*)malloc(sizeof(char)*(strlen(pathDir)+1+strlen((char*)file)+1));
      sprintf(tmp, "%s/%s", pathDir, (char*)file);
      if(g_file_test(tmp, G_FILE_TEST_IS_DIR) == FALSE)
	{
	  if(send(socket, "FICH ", (sizeof(char)*5), 0) == -1)
	    ret = -1;      
	  if(send(socket, (char*)file, (sizeof(char)*strlen(file)), 0) == -1)
	    ret = -1;
	  if(send(socket, " ENDL\n", (sizeof(char)*6), 0) == -1)
	    ret = -1;
	}
      free(tmp);
      file = g_dir_read_name(monDossier);
    }
  g_dir_close(monDossier);
  return ret;
}

int FindFichier(char * pathDir, char * fileName)
{
  int ret = 0;
  GDir* monDossier=g_dir_open(pathDir, 0, NULL);
  G_CONST_RETURN gchar* file = g_dir_read_name(monDossier);
  while(file != NULL)
    {
      if(strncmp((char*)file, fileName, (sizeof(char)*strlen(file))) == 0)
	ret = 1;
      file = g_dir_read_name(monDossier);
    }
  g_dir_close(monDossier);
  return ret;
}

int envoieFichier(char * chemin, const char* fichier, int socket)
{
  FILE *fs;
  int sent = 0, sizeBuf = 64, sizeFile, ret;
  char * s;
  char * concat;
  char * buffer = (char*)malloc(sizeBuf*sizeof(char));
  if(chemin[strlen(chemin)-1] != '/')
    {
      concat = (char*) malloc(sizeof(char)*(strlen(fichier)+strlen(chemin)+2));
      sprintf(concat, "%s/%s", chemin,fichier);
    }
  else
    {
      concat = (char*) malloc(sizeof(char)*(strlen(fichier)+strlen(chemin)+1));
      sprintf(concat, "%s%s", chemin,fichier);
    }
  fs = fopen(concat, "rb");
  free(concat);
  if(fs == NULL)
    {
      fprintf(stdout, "[clt:%d]! Erreur envoieFichier : fopen.\n", socket);
      free(buffer);
      return 1;
    }
  fseek(fs, 0, SEEK_END);
  sizeFile =  ftell(fs);
  s = (char*)malloc(sizeof(char)*sizeFile);
  sprintf(s, "%d", sizeFile);
  if(send(socket, "SIZE ", 5, 0) == -1)
    fprintf(stdout, "[clt:%d]! Erreur envoieFichier : send.\n", socket);
  if(send(socket, s, strlen(s)*sizeof(char), 0) == -1)
    fprintf(stdout, "[clt:%d]! Erreur envoieFichier : send.\n", socket);
  if(send(socket, "\n", 1, 0) == -1)
    fprintf(stdout, "[clt:%d]! Erreur envoieFichier : send.\n", socket);
  free(s);
  fseek(fs, 0, SEEK_SET);
  sent=ftell(fs);
  while(sent < sizeFile)
    {
      ret = fread(buffer, sizeof(char), sizeBuf, fs);
      if(ret <= 0)
	{
	  fprintf(stdout, "[clt:%d]! Erreur envoieFichier : fread.\n", socket);      
	  fclose(fs);
	  free(buffer);
	  return 1;
	}
      ret = send(socket, buffer, ret, 0);
      if(ret < 0)
	{
	  fprintf(stdout, "[clt:%d]! Erreur envoieFichier : send.\n", socket);      
	  fclose(fs);
	  free(buffer);
	  return 1;
	}
      sent+=ret;
    }
  fclose(fs);
  free(buffer);
  return 0;
}


